package org.wanho;

import java.util.ArrayList;
import java.util.function.Supplier;

/**
 * Author：汤小洋
 * Date：2023-05-08 14:46
 * Description：<描述>
 */
public class Test05_方法引用 {

    public static void main(String[] args) {
        ArrayList<Student> list = new ArrayList<>();
        list.add(new Student(43));
        list.add(new Student(15));
        list.add(new Student(26));

        // 使用匿名内部类
        // list.sort(new Comparator<Student>() {
        //     @Override
        //     public int compare(Student s1, Student s2) {
        //         return s1.age - s2.age;
        //     }
        // });
        // 使用Lambda表达式
        // list.sort((s1,s2) -> s1.age-s2.age);

        /**
         * 1.静态方法引用（类名::静态方法名）
         */
        // 简化写法，compare方法是静态方法，且参数列表与java.util.Comparator.compare(T o1,T o2)参数列表一致
        // list.sort(Student::compare);

        /**
         * 2.实例方法引用（对象名::实例方法名）
         */
        // 简化写法，compare方法是实例方法，且参数列表与java.util.Comparator.compare(T o1,T o2)参数列表一致
        // Student s = new Student();
        // list.sort(s::compare);

        /**
         * 3.类的实例方法引用（类名::实例方法名）
         */
        // 简化写法，compare方法是实例方法，java.util.Comparator.compare(T o1,T o2)的第一个参数，在compare()方法中被省略，第一参数默认为调用者本身
        // list.sort(Student::compare);
        // System.out.println(list);

        /**
         * 4.构造方法引用（类名::new）
         */
        // 使用匿名内部类
        // createStudent(new Supplier<Student>() {
        //     @Override
        //     public Student get() {
        //         return new Student();
        //     }
        // });
        // 使用Lamdba
        // createStudent(() -> new Student());

        createStudent(Student::new);
    }

    public static void createStudent(Supplier<Student> supplier){ // Supplier是jdk8新增的接口，表示提供者
        Student s = supplier.get();
        System.out.println(s);
    }

}

class Student {
    int age;

    public Student() {
    }

    public Student(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                "}\n";
    }

    // 静态方法
    // public static int compare(Student s1,Student s2){
    //     return s1.age - s2.age;
    // }

    // 实例方法
    public int compare(Student s1,Student s2){
        return s1.age - s2.age;
    }

    // 实例方法
    public int compare(Student s){
        return this.age - s.age;
    }
}
